home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / DSKDEV.68K < prev    next >
Text File  |  2001-09-30  |  8KB  |  284 lines

  1. ;DSKDEV.68K    APR-27-88    (ALSO SEE "INFOSTR")
  2. ;HANDLER FOR BYTE I/O USING THE DISK
  3. ;WRITTEN BY LOREN BLANEY FOR DFM ENGINEERING
  4. ;THIS IS BASED ON 6502 CODE WRITTEN BY P.J.R. BOYLE.
  5. ;
  6. ;REVISION HISTORY:
  7. ;FEB-15-86, ORIGINAL.
  8. ;SEP-14-86, CONVERTED TO ASM68K CONVENTIONS, AND MODIFIED.
  9. ;APR-27-88, CHANGE STRING TERMINATOR CONVENTION.
  10. ;
  11. ;NOTES:
  12. ;This handler requires that the buffers are an even multiple of 256
  13. ; bytes long (SET guarantees this).
  14. ;
  15.     NOLIST
  16.     INCLUDE    SYSPAG        ;GET SYSTEM PAGE DEFINITIONS
  17.     LIST
  18.  
  19. DEVNUM    EQU    3        ;BY CONVENTION THIS SHOULD BE DEVICE #3
  20.  
  21.     ORG    MEMTOP -$1100
  22. START    EQU    @        ;START ADDRESS OF THIS HANDLER
  23.  
  24. DSKDEV    DC.L    OPENI        ;0 = OPEN FOR INPUT
  25.     DC.L    OPENO        ;1 = OPEN FOR OUTPUT
  26.     DC.L    CHIN        ;2 = INPUT A BYTE
  27.     DC.L    CHOUT        ;3 = OUTPUT A BYTE
  28.     DC.L    CLOSE        ;4 = CLOSE OUTPUT FILE
  29.     DC.L    GETINFO        ;5 = GET INFO
  30.     DC.L    DUMMY        ;6 = SPARE
  31.     DC.L    DUMMY        ;7 = SPARE
  32.  
  33. ;VARIABLES:
  34. INBSIZ    DC.L    0        ;INPUT BUFFER SIZE IN BLOCKS
  35. INBPTR    DC.L    0        ;INPUT BUFFER BLOCK POINTER
  36. INPTR    DC.L    0        ;INPUT BUFFER BYTE POINTER
  37. INBEND    DC.L    0        ;END OF INPUT BUFFER+1, AS ACTUALLY READ
  38.  
  39. OTBSIZ    DC.L    0        ;OUTPUT BUFFER SIZE IN BLOCKS
  40. OTBPTR    DC.L    0        ;OUTPUT BUFFER BLOCK POINTER
  41. OTPTR    DC.L    0        ;OUTPUT BUFFER BYTE POINTER
  42.  
  43. ;-----------------------------------------------------------------------
  44. ;OPEN (INITIALIZE) AN INPUT FILE
  45. ;
  46. OPENI    MOVE.L    D0,-(SP)    ;SAVE D0
  47.  
  48.     TST.B    INFLG        ;DO WE HAVE AN INPUT FILE?
  49.     BNE.S    OPNI10        ;BRANCH IF YES
  50.     JSR    VERROR
  51.     ASCII    '7 - INPUT FILE NOT SET UP'
  52.     DC.B    0
  53.     BRA.S    OPNI90        ;EXIT
  54.  
  55. OPNI10    MOVE.L    INLBLK,INBPTR.L ;SET BLOCK POINTER TO FIRST BLOCK
  56.  
  57.     MOVE.L    INBUFE,D0    ;INBSIZ := (INBUFE - INBUF) /256
  58.     SUB.L    INBUF,D0    ;CALCULATE THE NUMBER OF BLOCKS
  59.     LSR.L    #8,D0        ; IN THE INPUT BUFFER
  60.     MOVE.L    D0,INBSIZ.L    ; (ASSUMES EVEN 256-BYTE MULTIPLES)
  61.  
  62.     MOVE.L    INBUFE,INBEND.L    ;SET THE POINTER TO MAKE THE INPUT
  63.     MOVE.L    INBUFE,INPTR.L    ; BUFFER APPEAR EMPTY
  64.     MOVE.B    #$55,INFLG    ;INDICATE THAT THE INPUT FILE IS OPEN
  65.  
  66. OPNI90    MOVE.L    (SP)+,D0    ;RESTORE D0
  67. DUMMY    RTS
  68.  
  69. ;-----------------------------------------------------------------------
  70. ;OPEN (INITIALIZE) AN OUTPUT FILE
  71. ;
  72. OPENO    MOVE.L    D0,-(SP)    ;SAVE D0
  73.  
  74.     CMPI.B    #$01,OTFLG    ;DO WE HAVE AN OUTPUT FILE?
  75.     BEQ.S    OPNO10        ;BRANCH IF YES
  76.     CMPI.B    #$55,OTFLG    ;IS IT ALREADY SET UP?
  77.     BEQ.S    OPNO10        ;BRANCH IF YES
  78.     JSR    VERROR
  79.     ASCII    '8 - OUTPUT FILE NOT SET UP'
  80.     DC.B    0
  81.     BRA.S    OPNO90        ;EXIT
  82.  
  83. OPNO10    MOVE.L    OTLBLK,OTBPTR.L    ;SET BLOCK POINTER TO FIRST BLOCK
  84.  
  85.     MOVE.L    OTBUFE,D0    ;OTBSIZ := (OTBUFE - OTBUF) /256
  86.     SUB.L    OTBUF,D0    ;CALCULATE THE NUMBER OF BLOCKS
  87.     LSR.L    #8,D0        ; IN THE OUTPUT BUFFER
  88.     MOVE.L    D0,OTBSIZ.L
  89.  
  90.     MOVE.L    OTBUF,OTPTR.L    ;RESET POINTER TO EMPTY
  91.     MOVE.B    #$55,OTFLG    ;FLAG OUTPUT FILE OPEN
  92.  
  93. OPNO90    MOVE.L    (SP)+,D0    ;RESTORE D0
  94.     RTS
  95.  
  96. ;-----------------------------------------------------------------------
  97. ;READ A BYTE FROM THE DISK FILE AND RETURN IT IN D0
  98. ;
  99. CHIN    MOVE.L    A6,-(SP)    ;SAVE A6
  100.  
  101.     CMPI.B    #$55,INFLG    ;DO WE HAVE AN OPEN INPUT FILE?
  102.     BEQ.S    CHI10        ;BRANCH IF YES
  103.     JSR    VERROR
  104.     ASCII    '9 - INPUT FILE NOT OPEN'
  105.     DC.B    0
  106.     MOVEQ    #0,D0        ;RETURN A 0
  107.     BRA    CHI90        ;EXIT
  108.  
  109. CHI10    MOVEA.L    INPTR.L,A6    ;GET THE BUFFER POINTER
  110.     CMPA.L    INBEND.L,A6    ;IS THE BUFFER FULL?
  111.     BLO    CHI50        ;BRANCH IF NOT
  112.  
  113. ;READ ANOTHER BUFFER FROM DISK
  114.     MOVE.L    INHBLK,D0    ;CALCULATE REMAINING NUMBER OF BLOCKS
  115.     SUB.L    INBPTR.L,D0    ;NBLKS := INHBLK - INBPTR +1    ?????
  116.     ADDQ.L    #1,D0
  117.     BHI.S    CHI20        ;BRANCH IF THERE IS AT LEAST ONE BLOCK
  118.     JSR    VERROR        ; REMAINING
  119.     ASCII    '11 - READ BEYOND INPUT FILE'
  120.     DC.B    0
  121.     MOVEQ    #0,D0        ;RETURN A 0
  122.     BRA.S    CHI90        ;EXIT
  123.  
  124. CHI20    CMP.L    INBSIZ.L,D0    ;IF NBLKS > INBSIZ THEN NBLKS:=INBSIZ
  125.     BLO.S    CHI30        ;USE THE SMALLER NUMBER OF BLOCKS
  126.     MOVE.L    INBSIZ.L,D0    ;I.E. USE EITHER THE SIZE OF THE BUFFER
  127. CHI30    MOVE.L    D0,NBLKS    ; OR THE REMAINING BLOCKS IF LESS THAN
  128.                 ; A BUFFER FULL
  129.     ASL.L    #8,D0        ;INBEND := INBUF + NBLKS *256
  130.     ADD.L    INBUF,D0    ;CALCULATE THE END OF THE BUFFER
  131.     MOVE.L    D0,INBEND.L    ;DON'T READ BEYOND END OF PARTIAL BUFFER
  132.  
  133.     MOVE.B    INUNT,UNIT    ;PASS REMAINING ARGS TO READ ROUTINE
  134.     MOVE.L    INBPTR.L,BLKNO
  135.     MOVE.L    INBUF,FADDR
  136.     MOVEA.W    #8,A6        ;SET FUNCTION CODE TO "READ"
  137.     JSR    VUNTHAN        ;READ A BUFFER FULL FROM DISK
  138.     TST.L    ERRLOC        ;DID WE GET AN ERROR?
  139.     BNE.S    CHI90        ;BRANCH IF YES
  140.  
  141.     MOVE.L    INBPTR.L,D0    ;INBPTR := INBPTR + NBLKS
  142.     ADD.L    NBLKS,D0    ;I.E. BUMP BLOCK POINTER
  143.     MOVE.L    D0,INBPTR.L
  144.     MOVEA.L    INBUF,A6    ;RESET BYTE POINTER TO START OF BUFFER
  145.  
  146. CHI50    MOVEQ    #0,D0
  147.     MOVE.B    (A6)+,D0    ;GET THE BYTE, AND INCREMENT POINTER
  148.     MOVE.L    A6,INPTR.L    ;SAVE THE POINTER
  149.  
  150. CHI90    MOVEA.L    (SP)+,A6    ;RESTORE A6
  151.     RTS
  152.  
  153. ;-----------------------------------------------------------------------
  154. ;FAST OUTPUT ENTRY POINT
  155. ;WRITE ARGUMENT TO DEVICE 3
  156. ; CHOUT(3,CH)
  157. CHOUT3    MOVE.L    (A5),D0        ;GET CHAR
  158.                 ;(PFALL)
  159. ;-----------------------------------------------------------------------
  160. ;OUTPUT THE BYTE IN D0 TO THE DISK FILE
  161. ;
  162. CHOUT    MOVE.L    A6,-(SP)    ;SAVE A6
  163.  
  164.     CMPI.B    #$55,OTFLG    ;IS THE OUTPUT FILE OPEN?
  165.     BEQ.S    CHO10        ;BRANCH IF YES
  166.     JSR    VERROR
  167.     ASCII    '10 - OUTPUT FILE NOT OPEN'
  168.     DC.B    0
  169.     BRA.S    CHO90        ;EXIT
  170.  
  171. CHO10    MOVEA.L    OTPTR.L,A6    ;IS THERE ROOM IN BUFFER FOR THIS BYTE?
  172.     CMPA.L    OTBUFE,A6    ; I.E. IS OTPTR < OTBUFE?
  173.     BLO.S    CHO50        ;BRANCH IF YES
  174.  
  175.     BSR    WRTBUF        ;THE BUFFER IS FULL SO WRITE IT TO DISK
  176.     TST.L    ERRLOC        ;DID WE GET AN ERROR?
  177.     BNE.S    CHO90        ;BRANCH IF YES
  178.     MOVEA.L    OTBUF,A6    ;RESET BYTE POINTER TO START OF OUTPUT
  179.                 ; BUFFER
  180. CHO50    MOVE.B    D0,(A6)+    ;STORE THE BYTE IN THE OUTPUT BUFFER
  181.     MOVE.L    A6,OTPTR.L    ; BUMP POINTER AND SAVE IT
  182.  
  183. CHO90    MOVEA.L    (SP)+,A6    ;RESTORE A6
  184.     RTS
  185.  
  186. ;-----------------------------------------------------------------------
  187. ;CLOSE THE OUTPUT FILE
  188. ;
  189. CLOSE    MOVE.L    D0,-(SP)    ;SAVE D0
  190.  
  191.     CMPI.B    #$55,OTFLG    ;IS THE OUTPUT FILE OPEN?
  192.     BNE.S    CLO90        ;BRANCH IF NOT - JUST EXIT
  193.  
  194.     MOVEQ    #EOF,D0        ;WRITE AN EOF
  195.     BSR.S    CHOUT
  196.  
  197.     MOVE.L    OTPTR.L,D0    ;RESET THE SIZE OF THE OUTPUT BUFFER TO
  198.     SUB.L    OTBUF,D0    ; INCLUDE ONLY THE BYTES THAT ARE
  199.                 ; ACTUALLY STORED IN IT
  200.     BEQ.S    CLO20        ;BRANCH IF THE BUFFER IS EMPTY
  201.     ADDI.L    #255,D0        ;OTBSIZ := (OTPTR - OTBUF + 255) /256
  202.     LSR.L    #8,D0        
  203.     MOVE.L    D0,OTBSIZ.L
  204.  
  205.     BSR.S    WRTBUF        ;WRITE OUTPUT BUFFER TO DISK
  206.     TST.L    ERRLOC        ;DID WE GET AN ERROR?
  207.     BNE.S    CLO90        ;BRANCH IF YES
  208.  
  209. CLO20    MOVE.L    OTBPTR.L,D0    ;OTHBLK := OTBPTR
  210.     SUBQ    #1,D0        ;?????? CONFLICTING CONVENTIONS ????
  211.     MOVE.L    D0,OTHBLK    ;TELL APEX WHERE THE FILE ACTUALLY ENDED
  212.     MOVE.B    #$FF,OTFLG    ;INDICATE THAT THE OUTPUT FILE IS CLOSED
  213.  
  214. CLO90    MOVE.L    (SP)+,D0    ;RESTORE D0
  215.     RTS
  216.  
  217. ;-----------------------------------------------------------------------
  218. ;RETURN THE ADDRESS OF THE INFORMATION ARRAY IN D0
  219. ;
  220. GETINFO    MOVE.L    #INFO,D0
  221.     RTS
  222.  
  223. INFO    DC.L    START        ;STARTING AND ENDING ADDRESSES OF
  224.     DC.L    END        ; THIS HANDLER
  225.     DC.L    INFOSTR
  226. INFOSTR    ASCII    'DSKDEV    APR-27-88  Disk sequential byte handler'
  227.     DC.B    0
  228.  
  229. ;-----------------------------------------------------------------------
  230. ;WRITE THE OUTPUT BUFFER TO DISK
  231. ;
  232. WRTBUF    MOVEM.L    D0/A6,-(SP)    ;SAVE REGISTERS
  233.  
  234.     MOVE.L    OTBPTR.L,D0    ;IF OTBPTR +OTBSIZ > OTHBLK+1 THEN ERROR
  235.     ADD.L    OTBSIZ.L,D0    ;I.E. ARE WE ATTEMPTING TO WRITE BEYOND
  236.     SUBQ.L    #1,D0        ;    ???????
  237.     CMP.L    OTHBLK,D0    ; THE END OF THE OUTPUT FILE?
  238.     BLS.S    WRTB20        ;BRANCH IF NOT
  239.     JSR    VERROR
  240.     ASCII    '12 - WRITE BEYOND OUTPUT FILE'
  241.     DC.B    0
  242.     BRA.S    WRTB90        ;EXIT
  243.  
  244. WRTB20    MOVE.B    OTUNT,UNIT    ;PASS ARGUMENTS
  245.     MOVE.L    OTBPTR.L,BLKNO
  246.     MOVE.L    OTBUF,FADDR
  247.     MOVE.L    OTBSIZ.L,NBLKS
  248.     MOVEA.W    #12,A6        ;SET FUNCTION CODE TO "WRITE"
  249.     JSR    VUNTHAN        ;WRITE BUFFER TO DISK
  250.     TST.L    ERRLOC        ;DID WE GET AN ERROR?
  251.     BNE.S    WRTB90        ;BRANCH IF YES
  252.  
  253.     MOVE.L    OTBPTR.L,D0    ;OTBPTR := OTBPTR + OTBSIZ
  254.     ADD.L    OTBSIZ.L,D0    ;BUMP OUTPUT BLOCK POINTER
  255.     MOVE.L    D0,OTBPTR.L
  256.  
  257. WRTB90    MOVEM.L    (SP)+,D0/A6    ;RESTORE REGISTERS
  258.     RTS
  259.  
  260. END    EQU    @-1        ;END ADDRESS OF THIS HANDLER
  261.     IF    END > START +$33F
  262.     ERROR -- TOO BIG
  263.     ENDIF
  264.  
  265. ;-----------------------------------------------------------------------
  266. ;HOOK THIS HANDLER INTO THE DEVICE HANDLER TABLE
  267. ;
  268.     ORG    4 *DEVNUM +DEVTBL
  269.     DC.L    DSKDEV
  270.  
  271. ;-----------------------------------------------------------------------
  272. ;ENTER FAST I/O ROUTINES INTO LIBRARY TABLE
  273.  
  274.     ORG    $C00
  275. VCHIN3    JMP    CHIN.L        ;CH:= CHIN(3)
  276. VCHOUT3    JMP    CHOUT3.L
  277.  
  278.     END
  279. ---
  280. ;ENTER FAST I/O ROUTINES INTO LIBRARY TABLE
  281.  
  282.     ORG    $C00
  283. VCHIN3    JMP    CHIN.L        ;CH:= CHIN(3)
  284. VCHOUT3    JMP    CHOU